package it.polimi.traveldream.ejb;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import it.polimi.traveldream.ejb.management.AerMgr;
import it.polimi.traveldream.ejb.management.AeroportoDTO;
import it.polimi.traveldream.ejb.management.PackDTO;

import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class BeanAeroporto implements AerMgr {
	@PersistenceContext
    private EntityManager em;
	
	@Resource
	private EJBContext context;
		
	public AeroportoDTO convertToDTO (Aeroporto aeroporto) {
		AeroportoDTO aeroportoDTO = new AeroportoDTO();
		aeroportoDTO.setCitta(aeroporto.getCitta());
		aeroportoDTO.setCodIata(aeroporto.getCodIata());
		aeroportoDTO.setNome(aeroporto.getNome());
		return aeroportoDTO;
	}
	
	@Override
	public List<AeroportoDTO> getListaAeroporti(){
		List<Aeroporto> aero = em.createNamedQuery(Aeroporto.FIND_ALL,Aeroporto.class).getResultList();
		List<AeroportoDTO> list=convertToDTO(aero);
		return list;
		
	}
	
	private List<AeroportoDTO> convertToDTO (List<Aeroporto> aerDaConv) {
		List<AeroportoDTO> returnedItems=new ArrayList<AeroportoDTO>();
		Iterator<Aeroporto> iter=aerDaConv.iterator();
		while(iter.hasNext()){
			returnedItems.add(convertToDTO(iter.next()));
		}
		return returnedItems;
	}	

	

	public Aeroporto convertFromDTO(AeroportoDTO aeroportoDTO) {
		Aeroporto aeroporto = new Aeroporto();
		aeroporto.setCodIata(aeroportoDTO.getCodIata());
		aeroporto.setCitta(aeroportoDTO.getCitta());
		aeroporto.setNome(aeroportoDTO.getNome());
		
		return aeroporto;
	}

	@Override
	public List<AeroportoDTO> getAeroportoNome(String codIata) {
		Query query = em.createNamedQuery(Aeroporto.FINDIATA, Aeroporto.class);
		query.setParameter(1, codIata);
		List<Aeroporto> aero=castList(Aeroporto.class,query.getResultList());
		List<AeroportoDTO> list=convertToDTO(aero);
		return list;
	}
	
	private static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
	    List<T> r = new ArrayList<T>(c.size());
	    for(Object o: c)
	      r.add(clazz.cast(o));
	    return r;
	}
	
	
	
}
